﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Runtime.Serialization;
using System.ComponentModel;

namespace elr_tracking_bal.ART
{
    public class Categoria : INotifyPropertyChanged
    {
        private int _ID_CATEGORIA;   
        private string _CATEGORIA;

        public int ID_CATEGORIA { 
            get{
                return _ID_CATEGORIA;
            }
            set {
                if (_ID_CATEGORIA != value)
                {
                    _ID_CATEGORIA = value;
                    if (this.PropertyChanged != null)
                    {
                        this.PropertyChanged(this, new PropertyChangedEventArgs("ID_CATEGORIA"));
                    }
                }
                
            }
        }

        public string CATEGORIA
        {
            get
            {
                return _CATEGORIA;
            }
            set
            {
                _CATEGORIA = value;
            }
        }
        
        /// <summary>
        /// Método que ejecuta el store para recuperar las Categorías 
        /// </summary>
        /// <returns></returns>
        public static DataTable GetData()
        {
            DataTable dt;
            dt = elr_tracking_dal.SrvDB.ExecuteQuery("SP_GETLIST_ART_CATEGORIA");
            return dt;
        }
        /// <summary>
        /// Método para recuperar la lista de Categorías
        /// </summary>
        /// <returns></returns>
        public static List<Categoria> GetDataCategoria()
        {
            try
            {
                DataTable dt;
                dt = Categoria.GetData();
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                else
                {
                    List<Categoria> list = dt.AsEnumerable().Select(
                        row => new  Categoria
                        {
                            ID_CATEGORIA = row.Field<int?>("ID_CATEGORIA").GetValueOrDefault(),
                            CATEGORIA = String.IsNullOrEmpty(row.Field<string>("CATEGORIA")) ? "" : row.Field<string>("CATEGORIA"),
                        }
                        ).ToList();
                    return list;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Método que inserta una Categoría
        /// </summary>
        /// <param name="art"></param>
        /// <returns></returns>
        public static elr_tracking_bal.UpsertStateMsg InsertCategoria(Categoria art)
        {
            Categoria inser;
            UpsertStateMsg inserart;
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_INSERT_ART_CATEGORIA '" + art.CATEGORIA + "'");

                inser = new Categoria(art.CATEGORIA);
                inserart = new UpsertStateMsg("Registros guardados " + dt.ToString(), true);
                return inserart;
            }
            catch (Exception ex)
            {
                inserart= new UpsertStateMsg("Error al guardar " + ex, false);
                return inserart;
            }
        }
        /// <summary>
        /// Método que borra varias Categorías
        /// </summary>
        /// <param name="ID_CATEGORIA"></param>
        /// <returns></returns>
        public static elr_tracking_bal.DeleteStateMsg DeleteCategoria(string[] ID_CATEGORIA)
        {
            elr_tracking_bal.DeleteStateMsg delete;
            string join;
            if (ID_CATEGORIA== null)
            {
                join = "";
            }
            else
            {
                join = String.Join(",", ID_CATEGORIA);
            }
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_DELETE_ART_CATEGORIA '" + join + "'");
                delete = new elr_tracking_bal.DeleteStateMsg("Registro eliminado" + dt.ToString(), true);
                return delete;
            }
            catch (Exception ex)
            {
                delete = new elr_tracking_bal.DeleteStateMsg("Error al eliminar" + ex, false);
                return delete;
            }
        }
        /// <summary>
        /// Método que borra una Categoría
        /// </summary>
        /// <param name="art"></param>
        /// <returns></returns>
        public static elr_tracking_bal.UpsertStateMsg UpdateCategoria(Categoria art)
        {
            Categoria update;
            UpsertStateMsg updateCat;
            try
            {
                int dt = elr_tracking_dal.SrvDB.ExecuteNonQuery("exec SP_UPDATE_ART_CATEGORIA " + art.ID_CATEGORIA + ",'" + art.CATEGORIA + "'");

                update = new Categoria(art.ID_CATEGORIA, art.CATEGORIA);
                updateCat = new UpsertStateMsg("Registros actualizados " + dt.ToString(), true);
                return updateCat;
            }
            catch (Exception ex)
            {
                updateCat = new UpsertStateMsg("Error al actualizar " + ex, false);
                return updateCat;
            }
        }
        /// <summary>
        /// Método que obtiene una Categoría
        /// </summary>
        /// <param name="ID_CATEGORIA"></param>
        /// <returns></returns>
        public static Categoria GetOneCategoria(int ID_CATEGORIA)
        {
            try
            {
                Categoria art;
                DataTable dt = elr_tracking_dal.SrvDB.ExecuteQuery("exec SP_GETONE_ART_CATEGORIA " + ID_CATEGORIA + "");
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                else if (ID_CATEGORIA == 0)
                {
                    return null;
                }
                else
                {
                    art = new Categoria (Convert.ToInt32(dt.Rows[0]["ID_CATEGORIA"]), Convert.ToString(dt.Rows[0]["CATEGORIA"]));
                }
                return art;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Constructor sin parámetros
        /// </summary>
        public Categoria() { }
        /// <summary>
        /// Constructor de un parámetro
        /// </summary>
        /// <param name="CATEGORIA"></param>
        public Categoria(string CATEGORIA)
        {
            this._CATEGORIA = CATEGORIA;
        }
        /// <summary>
        /// Constructor de dos parámetros
        /// </summary>
        /// <param name="ID_CATEGORIA"></param>
        /// <param name="CATEGORIA"></param>
        public Categoria(int ID_CATEGORIA, string CATEGORIA)
        {
            this._ID_CATEGORIA = ID_CATEGORIA;
            this._CATEGORIA = CATEGORIA;
            //this.check = false;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
